home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’95 / EssentialDoc / SB.p < prev    next >
Text File  |  1995-06-24  |  9KB  |  306 lines

  1. program STS;
  2.     uses FSM,Dialogs,Fonts,Resources,Files,Script,CursorCtl,ToolUtils,QDOffscreen,LowMem;
  3.     
  4.     const
  5.         SimpleTextName='Simple Text';
  6.         SimpleTextCrea='ttxt';
  7.         SimpleTextType='APPL';
  8.         
  9.     type
  10.         PICTinfo=record
  11.             size:integer;
  12.             frame:rect;
  13.         end;
  14.         PICTinfoPtr=^PictInfo;
  15.         PICTinfoH=^PICTInfoPtr;
  16.     
  17.     var
  18.         theVolume:integer;
  19.         theName:Str255;
  20.         theRefnum:integer;
  21.         theWindow:WindowPtr;
  22.         theGErr,err:OSErr;
  23.         theGSpec:FSSpec;
  24.         theErrorBox,theButtons,theGPF:PicHandle;
  25.         myRect,importRect:rect;
  26.         myGWorld: GWorldPtr;
  27.         lockFlag:boolean;
  28.         savePort: CGrafPtr;
  29.         saveDevice: GDHandle;
  30.         sButtonRect,dButtonRect:rect;
  31.         mloc:point;
  32.         ignoreBR,cancelBR:rect;
  33.         sitting,ignore,cancel:boolean;
  34.         dummy:longint;
  35.         theH:integer;
  36.         tempRgn,oldRgn:RgnHandle;
  37.         myWhite,myBlack:RGBColor;
  38.         Input:str255;
  39.  
  40. function GetIndVolume (whichVol: INTEGER; var volName: Str255; var volRefNum: INTEGER): OSErr;
  41.    {Return the name and vRefNum of volume specified by whichVol.}
  42.     var
  43.         volPB: HParamBlockRec;
  44.         error: OSErr;
  45.     begin
  46.         with volPB do
  47.             begin        {makes it easier to fill in!}
  48.                 ioNamePtr := @volName; {make sure it returns the name}
  49.                 ioVRefNum := 0;        {0 means use ioVolIndex}
  50.                 ioVolIndex := whichVol; {use this to determine the volume}
  51.             end; {with}
  52.         error := PBHGetVInfo(@volPB, false); {do it}
  53.         if error = noErr then
  54.             begin      {if no error occurred }
  55.                 volRefNum := volPB.ioVRefNum; {return the volume reference}
  56.             end; {if no error}
  57.               {other information is available from this record; see the FILE}
  58.               {Manager's description of PBHGetVInfo for more details...}
  59.         GetIndVolume := error; {return error code}
  60.     end;
  61.     
  62. procedure DisplayWindow;
  63.     begin
  64.         theWindow := GetNewWindow(128, nil, WindowPtr(-1));
  65.         SetPort(theWindow);
  66.         ShowWindow(theWindow);
  67.     end;
  68.     
  69. PROCEDURE EnumerShell (vRefNumToSearch: Integer; { the vRefNum to search}
  70.                            dirIDToSearch: LongInt);  { the dirID to search }
  71.        VAR
  72.           itemName: Str63;
  73.           myCPB: CInfoPBRec;
  74.           err: OSErr;
  75.         
  76.        PROCEDURE EnumerateCatalog (dirIDToSearch: LongInt);
  77.           CONST
  78.              ioDirFlgBit = 4;
  79.           VAR
  80.              index: Integer;
  81.        BEGIN { EnumerateCatalog }
  82.           index := 1;
  83.           REPEAT
  84.              WITH myCPB DO
  85.                 BEGIN
  86.                    ioFDirIndex := index;
  87.                    ioDrDirID := dirIDToSearch; { we need to do this every }
  88.                                                { time through }
  89.                    filler2 := 0; { Clear the ioACUser byte if search is  }
  90.                                  { interested in it. Nonserver volumes }
  91.                                  { won't clear it for you and the value  }
  92.                                  { returned is meaningless. }
  93.                 END;
  94.              err := PBGetCatInfo(@myCPB, FALSE);
  95.              IF err = noErr THEN
  96.                 IF BTST(myCPB.ioFlAttrib, ioDirFlgBit) THEN BEGIN { we have a directory }
  97.                     { do something useful with the directory information }
  98.                     { in myCPB }
  99.                     
  100.                     {Here we blast the image}
  101.                     theGErr:=FSMakeFSSpec(vRefNumToSearch,myCPB.ioDirID,SimpleTextName,theGSpec);
  102.                     if theGErr=noErr then
  103.                         theGErr:=FSpDelete(theGSpec);
  104.     
  105.                     EraseRect(myRect);
  106.                     MoveTo(42,42);
  107.                     DrawString(myCPB.ioNamePtr^);
  108.                     EnumerateCatalog(myCPB.ioDrDirID);
  109.                     err := noErr; {clear error return on way back}
  110.                    END
  111.                 ELSE
  112.                    BEGIN { we have a file, this is booring}
  113.                    END;
  114.              index := index + 1;
  115.           UNTIL (err <> noErr);
  116.        END;  { EnumerateCatalog }
  117.         
  118.     BEGIN { EnumerShell }
  119.        WITH myCPB DO
  120.           BEGIN
  121.              ioNamePtr := @itemName;
  122.              ioVRefNum := vRefNumToSearch;
  123.           END;
  124.        EnumerateCatalog(dirIDToSearch);
  125.     END;
  126.  
  127.  
  128. begin 
  129.  
  130.     InitGraf(@qd.thePort);
  131.     InitFonts;
  132.     FlushEvents(everyEvent - osMask - diskMask, 0);
  133.     InitWindows;
  134.     InitMenus;
  135.     TEInit;
  136.     InitDialogs(NIL);
  137.     InitCursor;
  138.     MaxApplZone;
  139.     MoreMasters;
  140.     
  141.     input:='';
  142.     importRect:=qd.thePort^.portBits.bounds;
  143.     theErrorBox:=GetPicture(128);
  144.     theGPF:=GetPicture(129);
  145.     theButtons:=GetPicture(130);
  146.     err := NewGWorld(myGWorld, 0, PICTinfoH(theButtons)^^.frame, nil, nil, 0);
  147.     lockFlag := LockPixels(GetGWorldPixMap(myGWorld));
  148.     GetGWorld(savePort, saveDevice);
  149.     SetGWorld(myGWorld, nil);
  150.     DrawPicture(theButtons, PICTinfoH(theButtons)^^.frame);
  151.     SetGWorld(savePort, saveDevice);
  152.     
  153.     theWindow:=GetNewCWindow(128,nil,WindowRef(-1));
  154.     SetPort(theWindow);
  155.     ShowWindow(theWindow);
  156.     TextFont(0);
  157.     MoveTo(30,26);
  158.     DrawString('Working…');
  159.  
  160.     myRect.top:=31;
  161.     myRect.bottom:=50;
  162.     myRect.left:=20;
  163.     myRect.right:=300;
  164.     
  165.     theVolume := 1;
  166.     while GetIndVolume(theVolume, theName, theRefnum) = noErr do begin
  167.         EnumerShell(theRefnum,fsRtDirID);
  168.         theVolume:=theVolume+1;
  169.     end;
  170.     
  171.     SizeWindow(theWindow,PICTinfoH(theErrorBox)^^.frame.right,PICTinfoH(theErrorBox)^^.frame.bottom,false);
  172.     MoveWindow(theWindow,importRect.right div 2 - PICTinfoH(theErrorBox)^^.frame.right div 2,
  173.         importRect.bottom div 2 - PICTinfoH(theErrorBox)^^.frame.bottom div 2,true);
  174.     DrawPicture(theErrorBox,PICTinfoH(theErrorBox)^^.frame);
  175.     sButtonRect.top:=0;
  176.     sButtonRect.bottom:=30;
  177.     sButtonRect.left:=0;
  178.     sButtonRect.right:=87;
  179.     ignoreBR.top:=113;
  180.     ignoreBR.bottom:=ignoreBR.top+30;
  181.     ignoreBR.left:=71;
  182.     ignoreBR.right:=ignoreBR.left+87;
  183.     CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, ignoreBR, srcCopy, nil);
  184.     sButtonRect.top:=0;
  185.     sButtonRect.bottom:=28;
  186.     sButtonRect.left:=88;
  187.     sButtonRect.right:=173;
  188.     cancelBR.top:=114;
  189.     cancelBR.bottom:=cancelBR.top+28;
  190.     cancelBR.left:=300;
  191.     cancelBR.right:=cancelBR.left+85;
  192.     CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, cancelBR, srcCopy, nil);
  193.     
  194.     sitting:=true;
  195.     while sitting do begin
  196.         GetMouse(mloc);
  197.         ignore:=PtInRect(mloc,ignoreBR);
  198.         cancel:=PtInRect(mloc,cancelBR);
  199.         sitting:=not (button or StillDown) or not ( ignore or  cancel);
  200.     end;
  201.     if ignore then begin
  202.         sButtonRect.top:=30;
  203.         sButtonRect.bottom:=60;
  204.         sButtonRect.left:=0;
  205.         sButtonRect.right:=87;
  206.         CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, ignoreBR, srcCopy, nil);
  207.     end else begin
  208.         sButtonRect.top:=30;
  209.         sButtonRect.bottom:=58;
  210.         sButtonRect.left:=88;
  211.         sButtonRect.right:=173;    
  212.         CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, cancelBR, srcCopy, nil);
  213.     end;
  214.     delay(15,dummy);
  215.     sButtonRect.top:=0;
  216.     sButtonRect.bottom:=30;
  217.     sButtonRect.left:=0;
  218.     sButtonRect.right:=87;
  219.     ignoreBR.top:=113;
  220.     ignoreBR.bottom:=ignoreBR.top+30;
  221.     ignoreBR.left:=71;
  222.     ignoreBR.right:=ignoreBR.left+87;
  223.     CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, ignoreBR, srcCopy, nil);
  224.     sButtonRect.top:=0;
  225.     sButtonRect.bottom:=28;
  226.     sButtonRect.left:=88;
  227.     sButtonRect.right:=173;
  228.     cancelBR.top:=114;
  229.     cancelBR.bottom:=cancelBR.top+28;
  230.     cancelBR.left:=300;
  231.     cancelBR.right:=cancelBR.left+85;
  232.     CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, cancelBR, srcCopy, nil);
  233.     delay(13,dummy);
  234.     
  235.     SizeWindow(theWindow,PICTinfoH(theGPF)^^.frame.right,PICTinfoH(theGPF)^^.frame.bottom,false);
  236.     MoveWindow(theWindow,importRect.right div 2 - PICTinfoH(theGPF)^^.frame.right div 2,
  237.         importRect.bottom div 2 - PICTinfoH(theGPF)^^.frame.bottom div 2,true);
  238.     DrawPicture(theGPF,PICTinfoH(theGPF)^^.frame);
  239.     
  240.     sButtonRect.top:=0;
  241.     sButtonRect.bottom:=28;
  242.     sButtonRect.left:=88;
  243.     sButtonRect.right:=173;
  244.     cancelBR.top:=114;
  245.     cancelBR.bottom:=cancelBR.top+28;
  246.     cancelBR.left:=186;
  247.     cancelBR.right:=cancelBR.left+85;
  248.     CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, cancelBR, srcCopy, nil);
  249.     
  250.     sitting:=true;
  251.     while sitting do begin
  252.         GetMouse(mloc);
  253.         cancel:=PtInRect(mloc,cancelBR);
  254.         sitting:=not (button or StillDown) or not cancel;
  255.     end;
  256.     sButtonRect.top:=30;
  257.     sButtonRect.bottom:=58;
  258.     sButtonRect.left:=88;
  259.     sButtonRect.right:=173;    
  260.     CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, cancelBR, srcCopy, nil);
  261.     delay(15,dummy);
  262.     sButtonRect.top:=0;
  263.     sButtonRect.bottom:=28;
  264.     sButtonRect.left:=88;
  265.     sButtonRect.right:=173;
  266.     cancelBR.top:=114;
  267.     cancelBR.bottom:=cancelBR.top+28;
  268.     cancelBR.left:=186;
  269.     cancelBR.right:=cancelBR.left+85;
  270.     CopyBits(GrafPtr(myGWorld)^.portBits, GrafPtr(theWindow)^.portBits,sButtonRect, cancelBR, srcCopy, nil);
  271.  
  272.     theH:=GetMBarHeight;
  273.     LMSetMBarHeight(0);
  274.     SizeWindow(theWindow,importRect.right,importRect.bottom,false);
  275.     MoveWindow(theWindow,0,0,true);
  276.     tempRgn:=NewRgn;
  277.     CopyRgn(theWindow^.clipRgn,oldRgn);
  278.     SetRectRgn(tempRgn,0,0,importRect.right,importRect.bottom);
  279.     UnionRgn(tempRgn,oldRgn,theWindow^.clipRgn);
  280.     theWindow^.visRgn:=theWindow^.clipRgn;
  281.     PaintRect(importRect);
  282.     Hide_Cursor;
  283.     myWhite.red:=65535;
  284.     myWhite.green:=65535;
  285.     myWhite.blue:=65535;
  286.     myBlack.red:=0;
  287.     myBlack.green:=0;
  288.     myBlack.blue:=0;
  289.     RGBForeColor(myWhite);
  290.     RGBBackColor(myBlack);
  291.     MoveTo(10,30);
  292.     DrawString('C:\WINDOWS\>');
  293.     myRect.top:=30;
  294.     myRect.bottom:=32;
  295.     myRect.left:=106;
  296.     myRect.right:=114;
  297.     
  298.     while not button do begin
  299.     PaintRect(myRect);
  300.     delay(10,dummy);
  301.     EraseRect(myRect);
  302.     delay(10,dummy);
  303.     end;
  304.     LMSetMBarHeight(theH);
  305.     DisposeRgn(tempRgn);
  306. end.